package com.dji.sdk.sample.internal.controller; import android.app.Application; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.v4.content.ContextCompat; import android.util.Log; import android.widget.Toast; import com.dji.sdk.sample.R; import com.squareup.otto.Bus; import com.squareup.otto.ThreadEnforcer; import dji.common.error.DJIError; import dji.common.error.DJISDKError; import dji.log.DJILog; import dji.sdk.base.BaseComponent; import dji.sdk.base.BaseProduct; import dji.sdk.products.Aircraft; import dji.sdk.products.HandHeld; import dji.sdk.sdkmanager.BluetoothProductConnector; import dji.sdk.sdkmanager.DJISDKManager; /** * Main application */ public class DJISampleApplication extends Application { public static final String TAG = DJISampleApplication.class.getName(); private static BaseProduct product; private static BluetoothProductConnector bluetoothConnector = null; private static Bus bus = new Bus(ThreadEnforcer.ANY); private static DJISampleApplication instance; /** * Gets instance of the specific product connected after the * API KEY is successfully validated. Please make sure the * API_KEY has been added in the Manifest */ public static synchronized BaseProduct getProductInstance() { if (null == product) { product = DJISDKManager.getInstance().getProduct(); } return product; } public static synchronized BluetoothProductConnector getBluetoothProductConnector() { if (null == bluetoothConnector) { bluetoothConnector = DJISDKManager.getInstance().getBluetoothProductConnector(); } return bluetoothConnector; } public static boolean isAircraftConnected() { return getProductInstance() != null && getProductInstance() instanceof Aircraft; } public static boolean isHandHeldConnected() { return getProductInstance() != null && getProductInstance() instanceof HandHeld; } public static synchronized Aircraft getAircraftInstance() { if (!isAircraftConnected()) return null; return (Aircraft) getProductInstance(); } public static synchronized HandHeld getHandHeldInstance() { if (!isHandHeldConnected()) return null; return (HandHeld) getProductInstance(); } @Override public void onCreate() { super.onCreate(); /* * handles SDK Registration using the API_KEY */ int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE); if (permissionCheck == 0 || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { DJISDKManager.getInstance().registerApp(this, mDJISDKManagerCallback); } instance = this; } public static DJISampleApplication getInstance() { return instance; } public static Bus getEventBus() { return bus; } private DJISDKManager.SDKManagerCallback mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() { @Override public void onRegister(DJIError error) { if (error == DJISDKError.REGISTRATION_SUCCESS) { DJILog.e("App registration", DJISDKError.REGISTRATION_SUCCESS.getDescription()); DJISDKManager.getInstance().startConnectionToProduct(); } else { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), R.string.sdk_registration_message, Toast.LENGTH_LONG) .show(); } }); } Log.v(TAG, error.getDescription()); } @Override public void onProductChange(BaseProduct oldProduct, BaseProduct newProduct) { Log.d(TAG, String.format("onProductChanged oldProduct:%s, newProduct:%s", oldProduct, newProduct)); product = newProduct; if (product != null) { product.setBaseProductListener(mDJIBaseProductListener); } notifyStatusChange(); } private BaseProduct.BaseProductListener mDJIBaseProductListener = new BaseProduct.BaseProductListener() { @Override public void onComponentChange(BaseProduct.ComponentKey key, BaseComponent oldComponent, BaseComponent newComponent) { if (newComponent != null) { newComponent.setComponentListener(mDJIComponentListener); } Log.d(TAG, String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s", key, oldComponent, newComponent)); notifyStatusChange(); } @Override public void onConnectivityChange(boolean isConnected) { Log.d(TAG, "onProductConnectivityChanged: " + isConnected); notifyStatusChange(); } }; private BaseComponent.ComponentListener mDJIComponentListener = new BaseComponent.ComponentListener() { @Override public void onConnectivityChange(boolean isConnected) { Log.d(TAG, "onComponentConnectivityChanged: " + isConnected); notifyStatusChange(); } }; private void notifyStatusChange() { bus.post(new ConnectivityChangeEvent()); } }; public static class ConnectivityChangeEvent { } }